#include <my_header.h>

/* Usage: ./7_同时写入 */
int main(int argc,char*argv[])
{
    int shmid = shmget(100, 4096, 0600|IPC_CREAT);

    int *p = (int *)shmat(shmid, NULL, 0);
    ERROR_CHECK(p, NULL, "shmat");

    p[0] = 0;
    // 父 子 进程可能会交替写入覆盖数据
    if(fork() == 0){
        for(int i = 0; i < 100000; i++){
            p[0]++;
        }
    }else{
        for(int i = 0; i < 100000; i++){
            p[0]++;
        }

        wait(NULL);
        printf("%d \n", p[0]);
    }
    // 删除内存
    int ret = shmctl(shmid, IPC_RMID, NULL);
    ERROR_CHECK(ret, -1, "shmctl");
    return 0;
}


#if 0
执行上述程序，所得到的结果和预期的200000并不一致。进程的切
换是造成结果不一致 的原因:当其父进程进程尝试对共享资源进行
访问的时候，比如将p[0]从共享内存取出到寄存器当中时，此时父进
程进程有可能被切换到子进程进程，而子进程进程会修改p[0]的数值
并写回到共享内存中，当重新切换回父进程进程的时候，父进程进
程会继续刚才的指令继续运行，就会将寄存器当中p[0]的内容写回内
存中，这样的话子进程进程刚刚的修改就丢失掉了(反之亦然)。这个
多个进程同时写入造成结果出错误的情况被称为竞争条件，
#endif

